Packages

library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## 
## The following object is masked from 'package:dplyr':
## 
##     combine
library(VIM)
## Loading required package: colorspace
## Loading required package: grid
## VIM is ready to use.
## 
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
## 
## Attaching package: 'VIM'
## 
## The following object is masked from 'package:datasets':
## 
##     sleep
library(corrplot) # for corrplot
## corrplot 0.95 loaded
library(GGally) # for ggpairs
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
library(tidyr) # for gather
library(dplyr) # for glimpse
options(encoding = "UTF-8")

I. Xử lý chung cho dữ liệu

data <- read.csv("data/diabetes_012_health_indicators_BRFSS2015.csv", na=c("", "NA", "N/A")) |> clean_names()
glimpse(data)
## Rows: 253,680
## Columns: 22
## $ diabetes_012           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0,…
## $ high_bp                <dbl> 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1,…
## $ high_chol              <dbl> 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,…
## $ chol_check             <dbl> 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ bmi                    <dbl> 40, 25, 28, 27, 24, 25, 30, 25, 30, 24, 25, 34,…
## $ smoker                 <dbl> 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0,…
## $ stroke                 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,…
## $ heart_diseaseor_attack <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,…
## $ phys_activity          <dbl> 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1,…
## $ fruits                 <dbl> 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0,…
## $ veggies                <dbl> 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,…
## $ hvy_alcohol_consump    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ any_healthcare         <dbl> 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ no_docbc_cost          <dbl> 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,…
## $ gen_hlth               <dbl> 5, 3, 5, 2, 2, 2, 3, 3, 5, 2, 3, 3, 3, 4, 4, 2,…
## $ ment_hlth              <dbl> 18, 0, 30, 0, 3, 0, 0, 0, 30, 0, 0, 0, 0, 0, 30…
## $ phys_hlth              <dbl> 15, 0, 30, 0, 0, 2, 14, 0, 30, 0, 0, 30, 15, 0,…
## $ diff_walk              <dbl> 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0,…
## $ sex                    <dbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,…
## $ age                    <dbl> 9, 7, 9, 11, 11, 10, 9, 11, 9, 8, 13, 10, 7, 11…
## $ education              <dbl> 4, 6, 4, 3, 5, 6, 6, 4, 5, 4, 6, 5, 5, 4, 6, 6,…
## $ income                 <dbl> 3, 1, 8, 6, 4, 8, 7, 4, 1, 3, 8, 1, 7, 6, 2, 8,…

Xử lý dữ liệu khuyết

aggr(data, ylab = c("Proportion of missings", "Pattern"), number = TRUE,
      cex.axis = 0.6, cex.numbers = 0.5)

Ta thấy được rằng không có bất cứ cột nào có dữ liệu bị khuyết.

Định dạng các cột định tính và định lượng

Tổng cộng có 22 cột, và tất cả các cột đều ở định dạng <dbl>, nghĩa là định dạng số, chúng ta sẽ cùng xem xét xem biến nào là biến định lượng và biến nào là biến định tính

unique_counts <- data.frame(
    variable = names(data),
    unique_count = sapply(data, function(x) length(unique(x)))
)
print(unique_counts)
##                                      variable unique_count
## diabetes_012                     diabetes_012            3
## high_bp                               high_bp            2
## high_chol                           high_chol            2
## chol_check                         chol_check            2
## bmi                                       bmi           84
## smoker                                 smoker            2
## stroke                                 stroke            2
## heart_diseaseor_attack heart_diseaseor_attack            2
## phys_activity                   phys_activity            2
## fruits                                 fruits            2
## veggies                               veggies            2
## hvy_alcohol_consump       hvy_alcohol_consump            2
## any_healthcare                 any_healthcare            2
## no_docbc_cost                   no_docbc_cost            2
## gen_hlth                             gen_hlth            5
## ment_hlth                           ment_hlth           31
## phys_hlth                           phys_hlth           31
## diff_walk                           diff_walk            2
## sex                                       sex            2
## age                                       age           13
## education                           education            6
## income                                 income            8

Theo như chi tiết về bộ dữ liệu, thì ta có tất cả là biến định tính, chỉ có bmi, ment_hlth, phys_hlth là biến định lượng.

qualitative_vars <- unique_counts |> filter(unique_count <= 13) 
qualitative_vars = qualitative_vars$variable

quantitative_vars <- c("bmi", "ment_hlth", "phys_hlth")

print(qualitative_vars)
##  [1] "diabetes_012"           "high_bp"                "high_chol"             
##  [4] "chol_check"             "smoker"                 "stroke"                
##  [7] "heart_diseaseor_attack" "phys_activity"          "fruits"                
## [10] "veggies"                "hvy_alcohol_consump"    "any_healthcare"        
## [13] "no_docbc_cost"          "gen_hlth"               "diff_walk"             
## [16] "sex"                    "age"                    "education"             
## [19] "income"
print(quantitative_vars)
## [1] "bmi"       "ment_hlth" "phys_hlth"
# Convert qualitative variables to factors
data[qualitative_vars] <- lapply(data[qualitative_vars], as.factor)

II. Tổng quan về từng biến trong bộ dữ liệu

plots <- lapply(quantitative_vars, function(var) {
    ggplot(data = data, aes(x = !!sym(var))) +
        geom_histogram(fill = "white", color = "black", binwidth = 1) +
        ggtitle(paste("Histogram of", var))
})

do.call(grid.arrange, c(plots, ncol = 1))

Tiếp theo ta tính toán các thống kê mô tả cho các biến định lượng:

summary_stats <- data |> 
    summarise(across(all_of(quantitative_vars), list(
        mean = ~mean(.),
        median = ~median(.),
        sd = ~sd(.),
        max = ~max(.),
        min = ~min(.)
    ), .names = "{col}_{fn}"))

summary_stats_t <- as.data.frame(t(summary_stats))
print(summary_stats_t)
##                         V1
## bmi_mean         28.382364
## bmi_median       27.000000
## bmi_sd            6.608694
## bmi_max          98.000000
## bmi_min          12.000000
## ment_hlth_mean    3.184772
## ment_hlth_median  0.000000
## ment_hlth_sd      7.412847
## ment_hlth_max    30.000000
## ment_hlth_min     0.000000
## phys_hlth_mean    4.242081
## phys_hlth_median  0.000000
## phys_hlth_sd      8.717951
## phys_hlth_max    30.000000
## phys_hlth_min     0.000000

Plot từng biến định tính một (bar chart)

plot_var = qualitative_vars[1]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Bộ dữ liệu này, số điểm quan sát không bị mắc bệnh tiểu đường là nhiều nhất, tiếp theo là đã bị tiểu đường ít nhất là tiền tiểu đường. Sự chênh lệch lớn giữa nhóm không mắc bệnh (0) và hai nhóm mắc bệnh (1 và 2) có thể gây mất cân bằng dữ liệu. Điều này có thể cần được xử lý nếu áp dụng các mô hình phân tích hoặc học máy để đảm bảo độ chính xác cao hơn.

plot_var = qualitative_vars[2]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Ta có các quan sát mắc tình trạng cao huyết áp ít hơn các quan sát bình thường, chênh lệch khoảng 30.000-40.000 người

plot_var = qualitative_vars[3]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Tương tự tình trạng cholesterol cao cũng vậy

plot_var = qualitative_vars[4]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Ta thấy được các quan sát đa số đã kiểm tra cholesterol trong 5 năm. Một số rất ít là vẫn chưa kiểm tra

plot_var = qualitative_vars[5]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Tỉ lệ người hút nhiều thuốc cao hơn tỉ lệ người ít hút thuốc hơn.

plot_var = qualitative_vars[6]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Đa số các quan sát đều chưa từng bị đột quỵ

plot_var = qualitative_vars[7]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Đa số các quan sát không bị bệnh tim mạch vành (CHD) hoặc nhồi máu cơ tim (MI)

plot_var = qualitative_vars[8]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Các quan sát rất tích cực hoạt động thể chất trong vòng 30 ngày, và khoảng hơn 1/5 quan sát không thực hiện việc đó.

plot_var = qualitative_vars[9]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Số người ăn trái cây ít nhất một ngày gần gấp đôi số người không.

plot_var = qualitative_vars[10]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Đối với việc ăn rau củ quả mỗi ngày thì các quan sát có thực hiện việc đó rất nhiều chiếm hơn 4/5 toàn bộ quan sát

plot_var = qualitative_vars[11]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Đa số các quan sát đều không uống nhiều rượu

plot_var = qualitative_vars[12]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Đa số các quan sát đều đã có tiếp cận các dịch vụ sức khỏe

plot_var = qualitative_vars[13]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Có một số ít quan sát (khoảng dưới 50.000) không có gặp bác sĩ trong vòng 12 tháng vì không có kinh phí.

plot_var = qualitative_vars[14]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Đa số các tình trạng sức khỏe chung của quan sát đều ở mức Very GoodGood.

plot_var = qualitative_vars[15]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Có khoảng gần 50.000 quan sát gặp tình trạng khó khăn trong đi lại

plot_var = qualitative_vars[16]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Lấy mẫu theo giới tính khá là đồng đều, không có sự chênh lệch lớn

plot_var = qualitative_vars[17]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Số lượng người tăng dần từ nhóm 1 đến nhóm 10, đạt đỉnh tại nhóm tuổi 10. Sau nhóm 10, số lượng người bắt đầu giảm dần ở các nhóm 11, 12, và 13.

Nhóm tuổi 10 có số lượng người cao nhất trong dataset. Các nhóm tuổi từ 1 đến 5 có số lượng người tham gia thấp hơn so với các nhóm từ 6 đến 10, cho thấy nhóm trung niên hoặc lớn tuổi chiếm tỷ lệ cao hơn.

plot_var = qualitative_vars[18]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

Biểu đồ cho thấy số lượng người tham gia tăng dần theo trình độ học vấn, với các nhóm giáo dục từ 1 đến 6. - Nhóm 6 (học vấn cao nhất) có số lượng người tham gia cao nhất, vượt trội hơn hẳn so với các nhóm khác. - Nhóm 1 (học vấn thấp nhất) có số lượng người tham gia thấp nhất, gần như không đáng kể. - Nhóm 4, 5, và 6 chiếm đa số, điều này có thể cho thấy rằng phần lớn người tham gia có trình độ học vấn từ trung học phổ thông trở lên.

plot_var = qualitative_vars[19]

ggplot(data = data, aes_string(x = plot_var, fill = plot_var)) +
    geom_bar() +
    ggtitle(paste("Bar Chart of", plot_var)) +
    theme(legend.position = "none")

  • Nhóm 8 (thu nhập cao nhất) chiếm tỷ lệ lớn nhất trong dataset, vượt trội hơn hẳn so với các nhóm khác.
  • Nhóm 1, 2, và 3 (thu nhập thấp) có số lượng ít hơn đáng kể so với các nhóm thu nhập trung bình và cao hơn.
  • Số lượng người tham gia có xu hướng tăng khi mức thu nhập tăng. Điều này có thể cho thấy những người có thu nhập cao hơn có xu hướng tham gia khảo sát nhiều hơn hoặc được tiếp cận dịch vụ khảo sát dễ dàng hơn.
  • Số lượng người tăng dần từ nhóm thu nhập thấp (1-3) đến nhóm thu nhập trung bình (4-6), sau đó tăng mạnh ở nhóm thu nhập cao (7-8).

III. Biến định lượng với biến định lượng

Biểu diễn phân bố của Quantitative Data

BMI

summary(data$bmi)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   12.00   24.00   27.00   28.38   31.00   98.00
ggplot(data = data, aes(x = bmi)) + 
    geom_histogram(aes(y = ..density..), binwidth = 1, fill = "lightblue", color = "black", bins = 30) + 
    geom_density(color = "blue", bw = "nrd0", kernel = "gaussian") + 
    geom_rug() +
    labs(title = "BMI Distribution with Density", x = "BMI", y = "Density") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5)) +
    geom_vline(aes(xintercept = mean(bmi)), color = "red", linetype = "dashed", size = 1)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

ggplot(data = data, aes(x = "", y = bmi)) + 
    geom_boxplot(fill = "lightblue", color = "black") + 
    labs(title = "Boxplot of BMI", x = "BMI", y = "Diabetes") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5)) +
    geom_hline(aes(yintercept = mean(bmi)), color = "red", linetype = "dashed", size = 1)

ggplot(data = data, aes(sample = bmi)) + 
    stat_qq() + 
    stat_qq_line() + 
    labs(title = "QQ Plot of BMI", x = "Theoretical Quantiles", y = "Sample Quantiles") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5))

#### 1. Tổng quan qua các chỉ số thống kê

  • Min = 12: Thấp nhất là 12, về mặt y học thì BMI dưới ~13 là rất thấp (có thể gặp ở một số trường hợp suy dinh dưỡng hay dữ liệu ngoại lai).
  • 1st Qu. = 24: Phân vị thứ nhất xấp xỉ 24, ở ngưỡng cận trên của “bình thường” (18.5–24.9).
  • Median = 27: Trung vị BMI là 27, rơi vào nhóm “overweight” (25–29.9).
  • Mean = 28.38: Trung bình BMI cao hơn trung vị, cho thấy phân phối lệch phải (right-skewed).
  • 3rd Qu. = 31: Phân vị thứ ba là 31, nằm trong khoảng béo phì cấp độ 1 (≥30).
  • Max = 98: Mức tối đa lên tới 98, rõ ràng là một giá trị ngoại lai cực lớn, khẳng định có một số lượng ít người với BMI rất cao.

Độ chênh lệch giữa Mean (28.38)Median (27) (~1.4 đơn vị) không quá lớn, nhưng phần đuôi phải (right tail) rất dài và “đậm đặc outlier” (thể hiện rõ ở Boxplot) khiến phân phối trở nên mất đối xứng.

2. Phân phối BMI (Histogram + Density)

  1. Dạng phân phối:
    • Histogram cho thấy một đỉnh (mode) nằm gần 25–26.
    • Phân phối lệch phải (right-skewed) rõ rệt; phía phải (các giá trị lớn) giảm dần nhưng kéo dài đến tận 70, 80, 90, thậm chí 98.
  2. So sánh với đường mật độ (blue line): Đường mật độ trùng khớp với việc có một đỉnh khoảng 25–26 và giảm dốc khi BMI > 30, tuy nhiên vẫn “bò” dài về bên phải.
  3. Mối tương quan Mean–Median:
    • Mean (28.38) > Median (27) → phù hợp với skew phải.
    • Giá trị 25 (đường vạch đứt đỏ) là ngưỡng overweight, và rõ ràng một bộ phận lớn dân số khảo sát nằm phía trên ngưỡng này.

3. Boxplot of BMI

  1. Vị trí hộp dữ liệu:
    • Hộp (box) nằm trong khoảng [24, 31] (tức Q1–Q3), với Median = 27.
    • Khoảng IQR = 31 – 24 = 7, không quá lớn so với toàn thang đo, nhưng do có nhiều outlier phía trên nên khi tính “phạm vi” (upper fence) bằng \(Q3 + 1.5*IQR = 31 + 1.5\times 7 = 31 + 10.5 = 41.5\), vẫn còn rất nhiều giá trị BMI > 41.5 được xếp thành outlier.
  2. Outliers cực lớn: Ta thấy rất nhiều điểm “nằm rải rác” từ 45, 50, 60… đến 98. Điều này cho thấy phân phối lệch phải kèm theo “đuôi” rất dài, tạo ra một loạt giá trị ngoại lai.
  3. Ý nghĩa thực tiễn:
    • Về y tế công cộng, BMI > 30 (béo phì) đã là nhóm nguy cơ, cao hơn nữa như 40, 50, 60 là béo phì bệnh lý (morbid obesity).
    • Rõ ràng, mẫu dữ liệu gồm nhiều cá nhân đang gặp tình trạng thừa cân, béo phì nặng.

4. QQ Plot (Phân phối so với Normal)

Quan sát QQ plot, ta thấy: 1. Khúc giữa: Dữ liệu ở dải giữa (khoảng 20–35) cong lên, sau đó “bẻ cong” mạnh ra khỏi đường chéo lý thuyết.
2. Phần đuôi dưới (BMI rất thấp) nằm phía trên đường lý thuyết ⇒ tail trái không quá dài (và có thể có một vài outlier thấp ~12).
3. Phần đuôi trên (BMI rất cao) vượt hẳn lên khỏi đường chuẩn, cho thấy sự phình to của đuôi phải ⇒ nặng outlier bên phải.

Tổng thể, QQ plot xác nhận BMI không tuân theo phân phối chuẩn (normal distribution), mà lệch phải rất rõ.

5. Một số gợi ý xử lý thống kê / tiền xử lý

  1. Loại bỏ hoặc xử lý outliers:
    • Các giá trị BMI cực cao (70, 80, 90…) có thể ảnh hưởng mạnh đến một số mô hình nhạy cảm với outliers (ví dụ: linear regression).
    • Trước khi làm mô hình (nhất là classification), ta cân nhắc:
      • Loại bỏ outliers bằng quy tắc IQR (nếu cảm thấy đó là dữ liệu sai sót hoặc quá hiếm).
      • Hoặc giữ lại nếu đó là dữ liệu thật, vì trong y khoa, các trường hợp BMI > 40 thực ra vẫn có tỉ lệ mắc tiểu đường, bệnh tim mạch cao, nên có giá trị dự báo.
  2. Biến đổi (transformation):
    • Có thể thử log transform (log(BMI)) hoặc power transform để giảm độ lệch phải. Tuy nhiên, BMI vốn đã là chỉ số được tính từ cân nặng/chiều cao, nên việc log-transform có thể khiến diễn giải lâm sàng khó hơn.
    • Hoặc sử dụng robust scaling (đưa median về 0, IQR về 1) để bớt ảnh hưởng của outliers.
  3. Binning / Discretization:
    • Phổ biến trong nghiên cứu lâm sàng, BMI thường chia thành nhóm: underweight (<18.5), normal (18.5–24.9), overweight (25–29.9), obese I (30–34.9), obese II (35–39.9), obese III (≥40).
    • Việc chia nhóm có thể giúp mô hình “dễ” xử lý hơn, nhất là mô hình tree-based, đồng thời dễ giải thích về mặt y học (phân loại nguy cơ).

Mental Health

summary(data$ment_hlth)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.000   0.000   3.185   2.000  30.000
ggplot(data = data, aes(x = ment_hlth)) + 
    geom_bar(fill = "blue", color = "black") +
    labs(title = "Mental Health Distribution", x = "Mental Health", y = "Frequency") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5))

ggplot(data = data, aes(x = "", y = ment_hlth)) + 
    geom_boxplot(fill = "lightblue", color = "black") +
    labs(title = "Boxplot of Mental Health", x = "", y = "Mental Health") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5)) +
    geom_hline(aes(yintercept = mean(ment_hlth)), color = "red", linetype = "dashed", size = 1)

ggplot(data = data, aes(sample = ment_hlth)) +
    stat_qq() +
    stat_qq_line() +
    labs(title = "QQ Plot of Mental Health", x = "Theoretical Quantiles", y = "Sample Quantiles") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5))

1. Tổng quan qua các chỉ số thống kê

  • Min = 0, Q1 = 0, Median = 0: Điều này cho thấy hơn 50% (thực tế là >50%) giá trị trong dữ liệu là 0 ngày “mental health not good”. Nói cách khác, một bộ phận lớn người tham gia không gặp vấn đề gì về sức khoẻ tinh thần trong 30 ngày qua (hoặc họ ghi nhận là 0).
  • Mean = 3.185: Trung bình lại cao hơn hẳn so với median = 0, chứng tỏ phân phối bị lệch phải rất mạnh (right-skewed), và có một số lượng đáng kể người có nhiều ngày “mental health not good”.
  • Q3 = 2: Tức 75% dữ liệu có số ngày ≤ 2.
  • Max = 30: Có người báo cáo tối đa 30 ngày gặp vấn đề về sức khoẻ tinh thần, cũng có thể xem là outlier (nhưng về mặt thực tiễn thì vẫn xảy ra).

Như vậy, đa số mẫu nằm ở 0 (không ngày gặp vấn đề), còn một nhóm nhỏ có giá trị rất cao (tới 30 ngày).

2. Phân phối Mental Health (Histogram)

  1. Hiện tượng “spike” tại 0
    • Trên histogram, cột ở 0 (nghĩa là 0 ngày “not good”) áp đảo, chiếm phần lớn mẫu.
    • Sau đó, tần suất giảm cực nhanh khi số ngày tăng lên.
    • Một số “cụm” nhỏ xuất hiện ở 1–2 ngày, 3–5 ngày, v.v… và một số ít trường hợp vọt lên 30 ngày.
  2. Dạng phân phối rời (count data)
    • Biến này có thể là biến đếm (integer từ 0 đến 30).
    • Rất nhiều “zero” → gợi ý khả năng zero-inflated hoặc hết sức lệch phải.

3. Boxplot of Mental Health

  1. Vị trí hộp:
    • Do Q1 = 0, Median = 0 và Q3 = 2, nên hộp (box) ở sát đáy, tập trung gần 0–2.
    • IQR = Q3 – Q1 = 2 – 0 = 2, khá nhỏ so với toàn thang đo (0–30).
  2. Outliers dày đặc:
    • Whisker trên (upper fence) thường được tính là Q3 + 1.5*IQR = 2 + 1.5*2 = 5. Vậy nên bất cứ giá trị > 5 đều bị xem là outlier theo định nghĩa boxplot.
    • Quan sát cho thấy có rất nhiều điểm từ 6 đến 30 (nhất là cụm 30) vươn thành một cột outlier kéo dài thẳng lên.

4. QQ Plot

  1. Phần lớn giá trị ở 0: QQ plot cho thấy một dải phẳng ở gần 0, do quá nhiều quan sát bằng 0.
  2. Đuôi phải vọt rất cao:
    • Khi >5, số ngày mental health tăng và ngày càng “chệch” khỏi đường thẳng chuẩn.
    • Ở đoạn trên cùng (gần 30), ta thấy nhiều điểm nằm sát nhau, càng bộc lộ rõ sự lệch phải và không tương thích với phân phối chuẩn.
  3. Tóm lại: Dữ liệu hoàn toàn không tuân theo normal distribution. Thay vào đó, nó giống một biến đếm (count) có số lượng 0 rất lớn (zero-inflated) và một đuôi phải kéo dài.

5. Hệ quả và gợi ý phân tích

  1. Không dùng giả định normal
    • Dữ liệu này không thích hợp để áp dụng trực tiếp các mô hình/kiểm định đòi hỏi phân phối chuẩn.
    • Nếu phân tích tương quan (chẳng hạn với Pearson), kết quả có thể sai lệch.
  2. Biến đổi dữ liệu
    • Log-transform (ví dụ \(\log(x+1)\)) hay sqrt-transform có thể giảm bớt độ lệch. Nhưng vẫn phải chú ý bản chất rời rạc (count) và việc 0 chiếm áp đảo.
    • Đôi khi, mô hình Poisson hay Negative Binomial (hoặc zero-inflated versions) mới phù hợp nếu ta cần modeling biến này như một biến phụ thuộc.
  3. Phân nhóm (binning)
    • Trong các bài toán classification, ta thường chia “mental health days” thành các nhóm ý nghĩa:
      • Không ngày (0)
      • Vài ngày (1–2, 3–5, …)
      • Nhiều ngày (≥14, hoặc ≥20, 30…) – tuỳ mục tiêu.
    • Cách này giúp xử lý tình trạng zero-inflation và dễ diễn giải trong lâm sàng (ví dụ “>=14 ngày” thường được xếp nhóm “nặng”).
  4. Xác thực outliers hay không: Các giá trị 30 ngày có thể là hoàn toàn hợp lý về mặt lâm sàng (người bị trầm cảm dai dẳng suốt tháng). Không nhất thiết loại bỏ, mà nên xử lý bằng mô hình thống kê phù hợp.

Physical Health

summary(data$phys_hlth)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.000   0.000   4.242   3.000  30.000
ggplot(data = data, aes(x = phys_hlth)) +
    geom_bar(fill = "blue", color = "black") +
    labs(title = "Physical Health Distribution", x = "Physical Health", y = "Frequency") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5))

ggplot(data = data, aes(x = "", y = phys_hlth)) +
    geom_boxplot(fill = "lightblue", color = "black") +
    labs(title = "Boxplot of Physical Health", x = "", y = "Physical Health") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5)) +
    geom_hline(aes(yintercept = mean(phys_hlth)), color = "red", linetype = "dashed", size = 1)

ggplot(data = data, aes(sample = phys_hlth)) +
    stat_qq() +
    stat_qq_line() +
    labs(title = "QQ Plot of Physical Health", x = "Theoretical Quantiles", y = "Sample Quantiles") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5))

Biểu diễn phân bố giữa các Quantitative Data

quantitative_data <- data.frame(
  BMI = data$bmi,
  MentHlth = data$ment_hlth,
  PhysHlth = data$phys_hlth
)
quantitative_data <- na.omit(quantitative_data)
ggplot(quantitative_data, aes(x = factor(round(MentHlth/5)*5), y = BMI)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Boxplot of BMI by MentHlth", x = "MentHlth (binned)", y = "BMI") +
  theme_minimal()

ggplot(quantitative_data, aes(x = factor(round(PhysHlth/5)*5), y = BMI)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Boxplot of BMI by PhysHlth", x = "PhysHlth (binned)", y = "BMI") +
  theme_minimal()

ggplot(quantitative_data, aes(x = factor(round(MentHlth/5)*5), y = PhysHlth)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Boxplot of PhysHlth by MentHlth", x = "MentHlth (binned)", y = "PhysHlth") +
  theme_minimal()

ggplot(quantitative_data, aes(x = factor(round(MentHlth/5)*5), y = BMI)) +
  geom_violin(fill = "lightgreen") +
  labs(title = "Violin Plot of BMI by MentHlth", x = "MentHlth (binned)", y = "BMI") +
  theme_minimal()

ggplot(quantitative_data, aes(x = factor(round(PhysHlth/5)*5), y = BMI)) +
  geom_violin(fill = "lightgreen") +
  labs(title = "Violin Plot of BMI by PhysHlth", x = "PhysHlth (binned)", y = "BMI") +
  theme_minimal()

ggplot(quantitative_data, aes(x = factor(round(MentHlth/5)*5), y = PhysHlth)) +
  geom_violin(fill = "lightgreen") +
  labs(title = "Violin Plot of PhysHlth by MentHlth", x = "MentHlth (binned)", y = "PhysHlth") +
  theme_minimal()

ggplot(quantitative_data, aes(x = MentHlth, y = BMI)) +
  geom_point(alpha = 0.6, color = "blue") +
  geom_smooth(method = "lm", color = "red") +
  labs(title = "Scatter Plot of BMI and MentHlth", x = "MentHlth", y = "BMI") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

ggplot(quantitative_data, aes(x = PhysHlth, y = BMI)) +
    geom_point(alpha = 0.6, color = "blue") +
    geom_smooth(method = "lm", color = "red") +
    labs(title = "Scatter Plot of BMI and PhysHlth", x = "PhysHlth", y = "BMI") +
    theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

ggplot(quantitative_data, aes(x = MentHlth, y = PhysHlth)) +
    geom_point(alpha = 0.6, color = "blue") +
    geom_smooth(method = "lm", color = "red") +
    labs(title = "Scatter Plot of PhysHlth and MentHlth", x = "MentHlth", y = "PhysHlth") +
    theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

1. Quan sát mối quan hệ: BMI ~ MentHlthBMI ~ PhysHlth

1.1 Boxplot/Violin plot: BMI theo MentHlth (hoặc PhysHlth)

  • Dáng phân phối BMI gần như giống nhau ở hầu hết các “bin” của MentHlth/PhysHlth. Tức median của BMI ở mỗi bin đều xoay quanh ~25–26, IQR cũng xấp xỉ 7–8 đơn vị (khoảng [22–30]) và vô số outlier vươn lên tới 80–100.
  • Không thấy xu hướng tăng/giảm rõ rệt của BMI khi MentHlth/PhysHlth tăng. Vẫn có dao động nhỏ ở median (ví dụ bin MentHlth=0 có median ~25, bin MentHlth=30 có median ~26…), nhưng độ chênh lệch không quá đáng kể so với độ trải rộng chung.

Từ đó, có vẻ không có mối liên hệ mạnh giữa “số ngày sức khỏe tinh thần/thể chất kém” với chỉ số BMI. Nói cách khác, ở mọi mức MentHlth/PhysHlth, ta đều gặp đủ loại BMI từ thấp (15–20) đến rất cao (70–100).

1.2 Scatter plot: BMI ~ MentHlth (hoặc PhysHlth)

  • Các scatter plot cho thấy một “mảng” dày ở vùng BMI ~25 và MentHlth/PhysHlth = 0 (vì rất nhiều quan sát 0 ngày kém).
  • Khi MentHlth/PhysHlth tăng, BMI vẫn phân bố trải rộng 15–100, không thu hẹp hay dịch chuyển nhiều.
  • Đường hồi quy (màu đỏ) thể hiện độ dốc (slope) hơi dương nhưng rất nhỏ → gợi ý nếu có tương quan thì cũng yếu (r-value có thể rất thấp).

Kết luận sơ bộ:

BMI hầu như không tương quan mạnh với MentHlth hay PhysHlth; mọi nhóm ngày “kém” vẫn có “bình quân” BMI khá tương đồng.

2. Quan sát mối quan hệ: PhysHlth ~ MentHlth

2.1 Boxplot/Violin plot: PhysHlth theo MentHlth

  • Khi MentHlth = 0 (tức không ngày sức khỏe tinh thần kém), median của PhysHlth cũng khá thấp (~0–1).
  • Khi MentHlth tăng dần (5, 10, 15…), median của PhysHlth có xu hướng tăng. Nhìn boxplot:
    • Ở MentHlth=10, median PhysHlth nhích lên khoảng 5–7
    • Ở MentHlth=20, median PhysHlth ~10
    • Ở MentHlth=30, median PhysHlth còn cao hơn nữa (~15 hoặc hơn)
  • Như vậy, có vẻ người có nhiều ngày sức khỏe tinh thần kém thường kèm theo nhiều ngày sức khỏe thể chất kém.

2.2 Scatter plot: PhysHlth ~ MentHlth

  • Dễ thấy từng “cột dọc” (theo MentHlth = 0, 1, 2… 30) và “hàng ngang” (theo PhysHlth = 0, 1, 2… 30), vì hai biến này đều là dạng đếm trong [0..30].
  • Đường hồi quy đỏ có độ dốc dương rõ hơn so với BMI ~ MentHlth/PhysHlth.
  • Có thể có hệ số tương quan (Spearman/Pearson) ở mức trung bình hoặc hơn. Quan sát biểu đồ “Scatter Plot of PhysHlth and MentHlth” cho thấy càng MentHlth cao → PhysHlth trung bình càng cao.

Kết luận sơ bộ:

MentHlthPhysHlth dường như có mối liên hệ đồng biến: khi số ngày gặp vấn đề về tinh thần tăng, thì số ngày thể chất kém cũng tăng.

3. Một vài gợi ý phân tích thống kê sâu hơn

  1. Kiểm định tương quan
    • Với biến đếm (0–30 ngày), dùng Spearman’s rank correlation có thể phù hợp hơn Pearson.
    • Kỳ vọng: \(\rho(\mathrm{MentHlth}, \mathrm{PhysHlth})\) > 0, có ý nghĩa thống kê.
    • Trong khi \(\rho(\mathrm{MentHlth}, \mathrm{BMI})\)\(\rho(\mathrm{PhysHlth}, \mathrm{BMI})\) có thể rất nhỏ (không ý nghĩa hoặc ý nghĩa yếu).
  2. Phân tích thêm
    • Nếu muốn, ta có thể so sánh trung bình BMI giữa các nhóm MentHlth/PhysHlth (VD: group = {0 ngày, >0 ngày}) qua t-test hoặc Mann-Whitney. Tuy nhiên, theo biểu đồ, khác biệt sẽ không lớn.
    • Cũng có thể phân tầng (stratify) theo MentHlth/PhysHlth để xem tỉ lệ “diabetes_012” hay tỉ lệ “high_BMI ≥30” khác nhau không.
  3. Trong mô hình classification
    • MentHlth và PhysHlth có thể (một phần) trùng lặp thông tin vì chúng dương tương quan. Có thể ta cần regularization hoặc tree-based model để tự chọn ra biến mạnh hơn.
    • BMI nhìn chung không bị phụ thuộc nhiều vào MentHlth/PhysHlth, nên không lo đa cộng tuyến, nhưng nó là biến quan trọng để dự đoán diabetes.

4. Kết luận

  • BMI gần như không đổi (hoặc chỉ tăng nhẹ) khi MentHlth/PhysHlth tăng: median quanh 25–26, độ trải rộng rất lớn ở mọi bin.
  • MentHlthPhysHlth lại có xu hướng tăng song song: khi MentHlth cao, PhysHlth trung bình cũng cao (hay nói cách khác, người gặp vấn đề tinh thần thường kèm thể chất kém).

Từ đó, trong các bước phân tích hoặc xây dựng mô hình, ta có thể:

  • Quan tâm đặc biệt đến mối liên hệ MentHlth–PhysHlth (có thể biến này chỉ ra nhóm bệnh nhân “suy giảm toàn diện” cả tinh thần lẫn thể chất).
  • Đánh giá vai trò độc lập của BMI trong việc dự báo tiểu đường (và có thể kết hợp MentHlth, PhysHlth theo cách phù hợp).
  • Lưu ý rằng MentHlth, PhysHlth vẫn là biến đếm (0–30) với rất nhiều giá trị 0, nên cần chọn mô hình/giải pháp “xử lý” phù hợp (binning, transformation, zero-inflated approach, v.v.) nếu dùng chúng làm biến phụ thuộc hoặc predictor nào đó trong mô hình thống kê.
cor.test(quantitative_data$MentHlth, quantitative_data$PhysHlth, method = "spearman")
## Warning in cor.test.default(quantitative_data$MentHlth,
## quantitative_data$PhysHlth, : Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  quantitative_data$MentHlth and quantitative_data$PhysHlth
## S = 1.8827e+15, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.3080503

Biểu diễn phân phối giữa Quantitative Data và Objective

quantitative_data <- data.frame(
  BMI = data$bmi,
  MentHlth = data$ment_hlth,
  PhysHlth = data$phys_hlth,
  Diabetes_012 = factor(data$diabetes_012)
)
quantitative_data <- na.omit(quantitative_data)
ggplot(quantitative_data, aes(x = Diabetes_012, y = BMI, fill = Diabetes_012)) +
  geom_boxplot() +
  labs(title = "Boxplot of BMI by Diabetes_012", x = "Diabetes Status", y = "BMI") +
  theme_minimal()

ggplot(quantitative_data, aes(x = Diabetes_012, y = MentHlth, fill = Diabetes_012)) +
  geom_boxplot() +
  labs(title = "Boxplot of MentHlth by Diabetes_012", x = "Diabetes Status", y = "MentHlth") +
  theme_minimal()

ggplot(quantitative_data, aes(x = Diabetes_012, y = PhysHlth, fill = Diabetes_012)) +
  geom_boxplot() +
  labs(title = "Boxplot of PhysHlth by Diabetes_012", x = "Diabetes Status", y = "PhysHlth") +
  theme_minimal()

ggplot(quantitative_data, aes(x = Diabetes_012, y = MentHlth, fill = Diabetes_012)) +
  geom_violin() +
  labs(title = "Violin Plot of MentHlth by Diabetes_012", x = "Diabetes Status", y = "MentHlth") +
  theme_minimal()

ggplot(quantitative_data, aes(x = Diabetes_012, y = PhysHlth, fill = Diabetes_012)) +
    geom_violin() +
    labs(title = "Violin Plot of PhysHlth by Diabetes_012", x = "Diabetes Status", y = "PhysHlth") +
    theme_minimal()

ggplot(quantitative_data, aes(x = Diabetes_012, y = BMI, fill = Diabetes_012)) +
    geom_violin() +
    labs(title = "Violin Plot of BMI by Diabetes_012", x = "Diabetes Status", y = "BMI") +
    theme_minimal()

ggplot(quantitative_data, aes(x = MentHlth, y = BMI, color = Diabetes_012)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Scatter Plot of BMI vs MentHlth by Diabetes_012", x = "MentHlth", y = "BMI") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

ggplot(quantitative_data, aes(x = PhysHlth, y = BMI, color = Diabetes_012)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Scatter Plot of BMI vs PhysHlth by Diabetes_012", x = "PhysHlth", y = "BMI") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

ggplot(quantitative_data, aes(x = MentHlth, y = PhysHlth, color = Diabetes_012)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Scatter Plot of MentHlth vs PhysHlth by Diabetes_012", x = "MentHlth", y = "PhysHlth") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

1. So sánh BMI qua 3 nhóm Diabetes_012

  • Nhóm 0 (không tiểu đường):
    • Median BMI thường thấp hơn hai nhóm còn lại, ở mức khoảng 25–26.
    • Dải IQR tầm [22–30], và vẫn có nhiều outlier lên tới 70, 80, thậm chí 100.
  • Nhóm 1 (tiền tiểu đường):
    • Median BMI nhỉnh hơn, khoảng 28.
    • Dải IQR cũng [25–32], và vẫn có những outlier rất cao.
  • Nhóm 2 (tiểu đường):
    • Median BMI tiệm cận khoảng 29–30, cao hơn so với nhóm 0.
    • Tương tự, outlier kéo dài đến 90–100.

Quan sát này phù hợp với hiểu biết y khoa: người tiền tiểu đường / tiểu đường thường có BMI cao hơn trung bình so với người không mắc. Dù vậy, phân phối BMI vẫn có độ trải rộng lớn trong từng nhóm.

2. So sánh MentHlth qua 3 nhóm Diabetes_012

  • Cả 3 nhóm đều có median MentHlth nằm rất thấp (đa số = 0), vì phần lớn người được khảo sát không ghi nhận ngày “tinh thần kém”.
  • Dù vậy, ta vẫn bắt gặp những outlier tới 30 ngày ở cả ba nhóm.
  • Khác biệt giữa median các nhóm 0, 1, 2 có vẻ rất nhỏ; có thể nhóm 1 (tiền tiểu đường) hơi cao hơn một chút so với 0 và 2, nhưng không rõ rệt.

Vậy, số ngày tinh thần kém (MentHlth) không tỏ ra khác biệt lớn giữa ba nhóm tiểu đường. Nếu có, có thể là rất nhẹ và cần kiểm định thống kê (như Kruskal–Wallis) để xác nhận.

3. So sánh PhysHlth qua 3 nhóm Diabetes_012

  • Nhóm 0: Median PhysHlth gần 0–1, IQR thấp, nhưng có nhiều outlier (một số ít người có 20–30 ngày ốm).
  • Nhóm 1: Median PhysHlth cao hơn, khoảng 3–5 ngày kém sức khỏe thể chất.
  • Nhóm 2: Median PhysHlth rõ ràng cao nhất, có thể trên 5–6 ngày, IQR rộng, và outlier lên tới 30 ngày.

Qua đó, có vẻ nhóm tiểu đường (2) và nhóm tiền tiểu đường (1) có xu hướng gặp nhiều ngày sức khỏe thể chất kém hơn nhóm không tiểu đường (0). Sự khác biệt này khá trực quan trên boxplot, cho thấy tần suất ngày ốm cao hơn ở người tiền tiểu đường và tiểu đường.

4. Scatter Plot và mối liên hệ bộ ba: BMI, MentHlth, PhysHlth, Diabetes_012

  1. BMI ~ MentHlth, phân tách theo Diabetes_012
    • Đường hồi quy cho mỗi nhóm (màu khác nhau) dốc lên nhẹ (tương quan yếu giữa BMI và MentHlth), trong đó nhóm 2 (tiểu đường) thường nằm phía trên một chút (BMI cao hơn).
    • Nói chung, MentHlth tăng không kéo theo BMI tăng rõ rệt, nhưng người đã tiểu đường (màu xanh) có BMI trung bình cao hơn hai nhóm còn lại.
  2. BMI ~ PhysHlth, phân tách theo Diabetes_012
    • Xu hướng tương tự: tương quan giữa BMI và PhysHlth chỉ hơi dương, độ dốc rất nhỏ.
    • Nhóm 2 (tiểu đường) vẫn nhỉnh hơn về BMI trung bình, đồng thời PhysHlth cũng cao hơn.
  3. MentHlth ~ PhysHlth, phân tách theo Diabetes_012
    • Cả 3 đường hồi quy (3 màu) đều có độ dốc dương: càng nhiều ngày tinh thần kém, càng nhiều ngày thể chất kém.
    • Đáng chú ý, nhóm 2 (tiểu đường) dường như có đường hồi quy cao nhất, rồi đến nhóm 1, rồi nhóm 0. Cho thấy người tiểu đường vừa có MentHlth, PhysHlth cao hơn trung bình (ngày kém nhiều), vừa có BMI cao hơn.

5. Kết luận chính

  1. BMI cao hơn ở nhóm 1 (tiền tiểu đường) và nhóm 2 (tiểu đường) so với nhóm 0, phù hợp với quan sát lâm sàng (béo phì là yếu tố nguy cơ cho tiểu đường).
  2. PhysHlth cho thấy sự phân tầng rõ: nhóm 2 > nhóm 1 > nhóm 0 (số ngày ốm nhiều nhất ở người đã mắc tiểu đường).
  3. MentHlth không khác biệt nhiều giữa các nhóm tiểu đường, tuy nhiên nhóm 1 có median hơi cao hơn nhóm 0, và nhóm 2 thì thấp hơn chút xíu (có thể do cỡ mẫu hoặc hành vi báo cáo khác nhau).
  4. MentHlth và PhysHlth vẫn tương quan dương, và mức độ này có vẻ cao hơn trong nhóm tiểu đường (người sức khỏe tinh thần kém cũng thường kèm thể chất kém).
  5. Để kiểm định chính thức, ta có thể làm:
    • ANOVA / Kruskal–Wallis cho sự khác biệt BMI giữa 3 nhóm Diabetes_012.
    • Kruskal–Wallis cho MentHlth và PhysHlth (vì biến đếm, nhiều zero). Những phân tích sơ bộ này gợi ý:
  • BMI là biến phân biệt tốt giữa người có và không có tiểu đường.
  • PhysHlth cũng có phân phối khác biệt khi so sánh nhóm tiểu đường với nhóm bình thường.
  • MentHlth ít có sự “chia rẽ” giữa các nhóm tiểu đường, song vẫn thể hiện tương quan với PhysHlth trong cả 3 nhóm.

Tất cả điều này giúp ta hiểu rõ hơn về đặc trưng của mỗi nhóm và có cơ sở để xây dựng mô hình phân loại (chẳng hạn Random Forest, Logistic Regression, v.v.) với BMI và PhysHlth (và các biến khác) là predictor quan trọng.

IV. Biến định tính và biến định tính

diabetes_012 vs high_bp

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$high_bp, data$diabetes_012))
colnames(freq_data) <- c("high_bp", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$high_bp <- as.factor(freq_data$high_bp)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = high_bp, y = frequency, fill = diabetes_012)) +
  geom_bar(stat = "identity", position = "dodge", width = 0.7) +
  geom_text(aes(label = frequency), 
            position = position_dodge(width = 0.7), 
            vjust = -0.5, 
            size = 3) +
  labs(
    title = "Diabetes Frequency by High Blood Pressure Status",
    x = "High Blood Pressure",
    y = "Frequency",
    fill = "Diabetes Status"
  ) +
  scale_fill_manual(
    values = c("red", "blue", "green"),
    labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
  ) +
  theme_bw() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12),
    legend.title = element_text(size = 14),
    legend.text = element_text(size = 12)
  )

Huyết áp không cao (0): - Phần lớn thuộc nhóm Không tiểu đường (134,391). - Nhóm Tiền tiểu đường (1,718) và Tiểu đường (8,742) thấp hơn rất nhiều.

Huyết áp cao (1): - Không tiểu đường vẫn chiếm đa số (79,312). - Số ca Tiền tiểu đường (2,913) và Tiểu đường (26,604) tăng đáng kể so với huyết áp không cao.

Nhận xét: Huyết áp cao có liên quan đến tần suất cao hơn của trạng thái Tiểu đường so với huyết áp bình thường.

diabetes_012 vs high_chol

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$high_chol, data$diabetes_012))
colnames(freq_data) <- c("high_chol", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$high_chol <- as.factor(freq_data$high_chol)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = high_chol, y = frequency, fill = diabetes_012)) +
  geom_bar(stat = "identity", position = "dodge", width = 0.7) +
  geom_text(aes(label = frequency), 
            position = position_dodge(width = 0.7), 
            vjust = -0.5, 
            size = 3) +
  labs(
    title = "Diabetes Frequency by High Cholesterol Status",
    x = "High Cholesterol",
    y = "Frequency",
    fill = "Diabetes Status"
  ) +
  scale_fill_manual(
    values = c("red", "blue", "green"),
    labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
  ) +
  theme_bw() +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12),
    legend.title = element_text(size = 14),
    legend.text = element_text(size = 12)
  )

Cholesterol không cao (0): - Phần lớn thuộc nhóm Không tiểu đường (132,673). - Nhóm Tiền tiểu đường (1,756) và Tiểu đường (11,660) thấp hơn nhiều.

Cholesterol cao (1): - Không tiểu đường vẫn chiếm đa số (81,030). - Số ca Tiền tiểu đường (2,875) và Tiểu đường (23,686) tăng đáng kể so với cholesterol không cao.

Nhận xét: Cholesterol cao có liên quan đến tần suất cao hơn của trạng thái Tiểu đường so với cholesterol bình thường.

diabetes_012 vs chol_check

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$chol_check, data$diabetes_012))
colnames(freq_data) <- c("chol_check", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$chol_check <- as.factor(freq_data$chol_check)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = chol_check, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Cholesterol Check Status",
        x = "Cholesterol Check",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không kiểm tra cholesterol (0): - Nhóm Không tiểu đường chiếm 9,167. - Nhóm Tiền tiểu đường (62) và Tiểu đường (241) rất ít.

Kiểm tra cholesterol (1): - Không tiểu đường chiếm đa số (204,536). - Nhóm Tiền tiểu đường (4,569) và Tiểu đường (35,105) tăng rõ rệt so với không kiểm tra.

Nhận xét: Việc kiểm tra cholesterol có liên quan đến số lượng cao hơn các trường hợp Tiền tiểu đườngTiểu đường, cho thấy tầm quan trọng của việc kiểm tra sức khỏe.

diabetes_012 vs smoker

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$smoker, data$diabetes_012))
colnames(freq_data) <- c("smoker", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$smoker <- as.factor(freq_data$smoker)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = smoker, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Smoking Status",
        x = "Smoking Status",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không hút thuốc (0): - Nhóm Không tiểu đường chiếm 121,879. - Nhóm Tiền tiểu đường (2,349) và Tiểu đường (17,029) thấp hơn.

Hút thuốc (1): - Nhóm Không tiểu đường chiếm đa số (91,824). - Nhóm Tiền tiểu đường (2,282) và Tiểu đường (18,317) tăng nhẹ so với không hút thuốc.

Nhận xét: Hút thuốc có liên quan đến tần suất cao hơn của trạng thái Tiểu đường, tuy nhiên, số lượng người Không tiểu đường vẫn chiếm ưu thế trong cả hai nhóm.

diabetes_012 vs stroke

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$stroke, data$diabetes_012))
colnames(freq_data) <- c("stroke", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$stroke <- as.factor(freq_data$stroke)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = stroke, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Stroke Status",
        x = "Stroke Status",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không bị đột quỵ (0): - Nhóm Không tiểu đường chiếm 206,944. - Nhóm Tiền tiểu đường (4,366) và Tiểu đường (32,078) thấp hơn nhưng vẫn đáng kể.

Có bị đột quỵ (1): - Nhóm Không tiểu đường giảm xuống còn 6,759. - Nhóm Tiền tiểu đường (265) và Tiểu đường (3,268) cũng có xu hướng giảm nhưng tỷ lệ Tiểu đường vẫn cao hơn Tiền tiểu đường.

Nhận xét: Tình trạng đột quỵ có liên quan đến sự gia tăng tỷ lệ Tiểu đường, đặc biệt ở nhóm đã từng bị đột quỵ.

diabetes_012 vs heart_diseaseor_attack

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$heart_diseaseor_attack, data$diabetes_012))
colnames(freq_data) <- c("heart_diseaseor_attack", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$heart_diseaseor_attack <- as.factor(freq_data$heart_diseaseor_attack)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = heart_diseaseor_attack, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Heart Disease or Attack Status",
        x = "Heart Disease or Attack Status",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không có bệnh tim hoặc đau tim (0): - Nhóm Không tiểu đường chiếm 198,352. - Nhóm Tiền tiểu đường (3,967) và Tiểu đường (27,468) thấp hơn đáng kể.

Có bệnh tim hoặc đau tim (1): - Nhóm Không tiểu đường giảm xuống còn 15,351. - Nhóm Tiền tiểu đường (664) và Tiểu đường (7,878) tăng tỷ lệ đáng kể so với nhóm không có bệnh.

Nhận xét: Tình trạng bệnh tim hoặc đau tim có liên quan đến sự gia tăng tỷ lệ mắc Tiểu đường, đặc biệt ở nhóm đã từng có tiền sử bệnh tim hoặc đau tim.

diabetes_012 vs phys_activity

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$phys_activity, data$diabetes_012))
colnames(freq_data) <- c("phys_activity", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$phys_activity <- as.factor(freq_data$phys_activity)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = phys_activity, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Physical Activity Status",
        x = "Physical Activity Status",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không hoạt động thể chất (0): - Nhóm Không tiểu đường chiếm 47,212. - Nhóm Tiền tiểu đường (1,489) và Tiểu đường (13,059) thấp hơn nhưng đáng kể.

Có hoạt động thể chất (1): - Nhóm Không tiểu đường tăng lên 166,491. - Nhóm Tiền tiểu đường (3,142) và Tiểu đường (22,287) cũng tăng so với nhóm không hoạt động thể chất.

Nhận xét: Hoạt động thể chất có liên quan đến sự gia tăng tỷ lệ Tiểu đường, tuy nhiên nhóm có hoạt động thể chất cũng có tỷ lệ Không tiểu đường cao hơn hẳn, cho thấy lợi ích của việc tập luyện.

diabetes_012 vs fruits

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$fruits, data$diabetes_012))
colnames(freq_data) <- c("fruits", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$fruits <- as.factor(freq_data$fruits)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = fruits, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Fruits Consumption",
        x = "Fruits Consumption",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không tiêu thụ trái cây (0): - Nhóm Không tiểu đường chiếm 76,287. - Nhóm Tiền tiểu đường (1,842) và Tiểu đường (14,653) thấp hơn đáng kể.

Có tiêu thụ trái cây (1): - Nhóm Không tiểu đường tăng lên 137,416. - Nhóm Tiền tiểu đường (2,789) và Tiểu đường (20,693) cũng tăng so với nhóm không tiêu thụ trái cây.

Nhận xét: Việc tiêu thụ trái cây có liên quan đến sự gia tăng tỷ lệ Tiểu đường, nhưng đồng thời cũng cho thấy tỷ lệ Không tiểu đường cao hơn, phản ánh lợi ích sức khỏe của trái cây.

diabetes_012 vs veggies

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$veggies, data$diabetes_012))
colnames(freq_data) <- c("veggies", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$veggies <- as.factor(freq_data$veggies)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = veggies, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Vegetables Consumption",
        x = "Vegetables Consumption",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không tiêu thụ rau xanh (0): - Nhóm Không tiểu đường chiếm 38,159. - Nhóm Tiền tiểu đường (1,070) và Tiểu đường (8,610) thấp hơn đáng kể.

Có tiêu thụ rau xanh (1): - Nhóm Không tiểu đường tăng lên 175,544. - Nhóm Tiền tiểu đường (3,561) và Tiểu đường (26,736) cũng tăng rõ rệt so với nhóm không tiêu thụ rau xanh.

Nhận xét: Tiêu thụ rau xanh có liên quan đến sự gia tăng tỷ lệ Không tiểu đường, phản ánh lợi ích sức khỏe của rau xanh trong việc giảm nguy cơ mắc bệnh tiểu đường.

diabetes_012 vs hvy_alcohol_consump

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$hvy_alcohol_consump, data$diabetes_012))
colnames(freq_data) <- c("hvy_alcohol_consump", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$hvy_alcohol_consump <- as.factor(freq_data$hvy_alcohol_consump)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = hvy_alcohol_consump, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Heavy Alcohol Consumption",
        x = "Heavy Alcohol Consumption",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không tiêu thụ rượu nặng (0): - Nhóm Không tiểu đường chiếm 200,487. - Nhóm Tiền tiểu đường (4,423) và Tiểu đường (34,514) cao hơn đáng kể.

Có tiêu thụ rượu nặng (1): - Nhóm Không tiểu đường giảm xuống còn 13,216. - Nhóm Tiền tiểu đường (208) và Tiểu đường (832) rất thấp.

Nhận xét: Tiêu thụ rượu nặng có liên quan đến tỷ lệ thấp hơn ở cả ba trạng thái, nhưng sự giảm này có thể liên quan đến số lượng người tiêu thụ rượu nặng ít hơn trong tổng số mẫu.

diabetes_012 vs any_healthcare

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$any_healthcare, data$diabetes_012))
colnames(freq_data) <- c("any_healthcare", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$any_healthcare <- as.factor(freq_data$any_healthcare)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = any_healthcare, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Any Healthcare Status",
        x = "Any Healthcare",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không tiếp cận dịch vụ chăm sóc sức khỏe (0): - Nhóm Không tiểu đường chiếm 10,741. - Nhóm Tiền tiểu đường (254) và Tiểu đường (1,422) thấp hơn nhiều.

Có tiếp cận dịch vụ chăm sóc sức khỏe (1): - Nhóm Không tiểu đường tăng mạnh lên 202,962. - Nhóm Tiền tiểu đường (4,377) và Tiểu đường (33,924) cũng tăng đáng kể.

Nhận xét: Việc tiếp cận dịch vụ chăm sóc sức khỏe có liên quan đến sự gia tăng tỷ lệ Không tiểu đườngTiểu đường, cho thấy tầm quan trọng của dịch vụ y tế trong việc phát hiện và quản lý bệnh tiểu đường.

diabetes_012 vs no_docbc_cost

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$no_docbc_cost, data$diabetes_012))
colnames(freq_data) <- c("no_docbc_cost", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$no_docbc_cost <- as.factor(freq_data$no_docbc_cost)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = no_docbc_cost, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by No Doctor Because of Cost Status",
        x = "No Doctor Because of Cost",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không bị hạn chế vì chi phí (0): - Nhóm Không tiểu đường chiếm 196,690. - Nhóm Tiền tiểu đường (4,032) và Tiểu đường (31,604) cao hơn đáng kể.

Bị hạn chế vì chi phí (1): - Nhóm Không tiểu đường giảm xuống còn 17,013. - Nhóm Tiền tiểu đường (599) và Tiểu đường (3,742) cũng giảm đáng kể.

Nhận xét: Chi phí cản trở việc đến bác sĩ có liên quan đến tỷ lệ Không tiểu đườngTiểu đường thấp hơn, cho thấy rằng việc tiếp cận bác sĩ bị giới hạn bởi chi phí có thể làm giảm khả năng phát hiện và quản lý bệnh tiểu đường.

diabetes_012 vs gen_hlth

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$gen_hlth, data$diabetes_012))
colnames(freq_data) <- c("gen_hlth", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$gen_hlth <- as.factor(freq_data$gen_hlth)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = gen_hlth, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by General Health Status",
        x = "General Health Status",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Tình trạng sức khỏe tốt hơn (1 - 2): - Mức 1: Nhóm Không tiểu đường chiếm 43,846, trong khi Tiền tiểu đường (313) và Tiểu đường (140) rất thấp. - Mức 2: Nhóm Không tiểu đường chiếm 81,489, cao nhất trong tất cả các mức. Nhóm Tiền tiểu đường (1,214) và Tiểu đường (6,381) tăng hơn so với mức 1.

Tình trạng sức khỏe trung bình (3): - Nhóm Không tiểu đường giảm xuống 60,461, trong khi nhóm Tiền tiểu đường (1,728) và Tiểu đường (13,457) tăng đáng kể.

Tình trạng sức khỏe kém hơn (4 - 5): - Mức 4: Nhóm Không tiểu đường giảm còn 20,755, nhóm Tiền tiểu đường (1,025) và Tiểu đường (9,790) tiếp tục tăng. - Mức 5: Nhóm Không tiểu đường giảm thấp nhất, chỉ còn 7,152, trong khi nhóm Tiền tiểu đường (351) và Tiểu đường (4,578) vẫn hiện diện đáng kể.

Nhận xét: Tình trạng sức khỏe tổng quát kém hơn có liên quan đến tỷ lệ Tiểu đường cao hơn, trong khi nhóm có sức khỏe tốt chủ yếu thuộc nhóm Không tiểu đường, nhấn mạnh mối quan hệ giữa sức khỏe tổng thể và nguy cơ mắc bệnh tiểu đường.

diabetes_012 vs diff_walk

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$diff_walk, data$diabetes_012))
colnames(freq_data) <- c("diff_walk", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$diff_walk <- as.factor(freq_data$diff_walk)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = diff_walk, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Difficulty Walking Status",
        x = "Difficulty Walking",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Không gặp khó khăn khi đi lại (0): - Nhóm Không tiểu đường chiếm 185,434. - Nhóm Tiền tiểu đường (3,346) và Tiểu đường (22,225) thấp hơn nhiều so với nhóm không tiểu đường.

Có khó khăn khi đi lại (1): - Nhóm Không tiểu đường giảm xuống còn 28,269. - Nhóm Tiền tiểu đường (1,285) và Tiểu đường (13,121) tăng rõ rệt so với nhóm không gặp khó khăn.

Nhận xét: Khó khăn khi đi lại có liên quan đến tỷ lệ mắc Tiểu đường cao hơn, phản ánh tác động của các vấn đề vận động đối với nguy cơ mắc bệnh tiểu đường.

diabetes_012 vs sex

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$sex, data$diabetes_012))
colnames(freq_data) <- c("sex", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$sex <- as.factor(freq_data$sex)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = sex, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Sex",
        x = "Sex",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Giới tính 0 (Nữ): - Nhóm Không tiểu đường chiếm 120,959. - Nhóm Tiền tiểu đường (2,604) và Tiểu đường (18,411) thấp hơn đáng kể.

Giới tính 1 (Nam): - Nhóm Không tiểu đường giảm xuống còn 92,744. - Nhóm Tiền tiểu đường (2,027) và Tiểu đường (16,935) cũng thấp hơn so với nhóm nữ.

Nhận xét: Nhóm nữ có tỷ lệ Không tiểu đường cao hơn so với nhóm nam, trong khi tỷ lệ Tiểu đường giữa hai giới tính tương đối gần nhau. Điều này cho thấy giới tính có thể ảnh hưởng đến nguy cơ mắc bệnh tiểu đường.

diabetes_012 vs age

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$age, data$diabetes_012))
colnames(freq_data) <- c("age", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$age <- as.factor(freq_data$age)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = age, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Age",
        x = "Age",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

  • Nhóm tuổi 1 - 5:
    • Nhóm Không tiểu đường tăng dần từ 5,601 (tuổi 1) lên 13,055 (tuổi 5).
    • Nhóm Tiểu đường rất thấp, dao động từ 278 (tuổi 1) đến 1,051 (tuổi 5).
  • Nhóm tuổi 6 - 10:
    • Nhóm Không tiểu đường đạt đỉnh ở độ tuổi 9 (26,809).
    • Nhóm Tiểu đường tăng từ 1,742 (tuổi 6) lên 7,033 (tuổi 9), sau đó giảm nhẹ ở tuổi 10 (6,558).
  • Nhóm tuổi 11 - 13:
    • Nhóm Không tiểu đường giảm dần từ 17,790 (tuổi 11) xuống 13,701 (tuổi 13).
    • Nhóm Tiểu đường giảm từ 5,141 (tuổi 11) xuống 3,209 (tuổi 13).

Nhận xét: Tần suất mắc bệnh tiểu đường (đặc biệt nhóm Không tiểu đường) đạt đỉnh ở nhóm tuổi trung niên (7 - 9 tuổi) và giảm dần sau đó. Nhóm Tiểu đường tăng dần theo độ tuổi, phản ánh nguy cơ tăng cao khi tuổi tăng.

diabetes_012 vs education

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$education, data$diabetes_012))
colnames(freq_data) <- c("education", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$education <- as.factor(freq_data$education)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = education, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Education Level",
        x = "Education Level",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Trình độ học vấn 1 - 3: - Mức 1: Nhóm Không tiểu đường rất thấp (125), và nhóm Tiểu đường chỉ là 47. - Mức 2: Nhóm Không tiểu đường tăng lên 2,699, và nhóm Tiểu đường tăng lên 1,183. - Mức 3: Nhóm Không tiểu đường là 6,868, và nhóm Tiểu đường đạt 2,296.

Trình độ học vấn 4 - 6: - Mức 4: Nhóm Không tiểu đường tăng mạnh lên 50,334, và nhóm Tiểu đường đạt 11,066. - Mức 5: Nhóm Không tiểu đường đạt 58,223, và nhóm Tiểu đường là 10,354. - Mức 6: Nhóm Không tiểu đường cao nhất ở mức 95,454, trong khi nhóm Tiểu đường đạt 10,400.

Nhận xét: Tần suất Không tiểu đường tăng mạnh theo trình độ học vấn, đặc biệt ở mức cao hơn (4 - 6). Tỷ lệ Tiểu đường cũng tăng lên ở các trình độ học vấn cao, nhưng không đáng kể so với nhóm Không tiểu đường, cho thấy mối liên hệ giữa trình độ học vấn và khả năng quản lý sức khỏe tốt hơn.

diabetes_012 vs income

# Tạo tần suất của các nhóm
freq_data <- as.data.frame(table(data$income, data$diabetes_012))
colnames(freq_data) <- c("income", "diabetes_012", "frequency")

# Chuyển đổi cột thành kiểu số
freq_data$income <- as.factor(freq_data$income)
freq_data$diabetes_012 <- as.factor(freq_data$diabetes_012)

# Vẽ biểu đồ
ggplot(freq_data, aes(x = income, y = frequency, fill = diabetes_012)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    geom_text(aes(label = frequency), 
                        position = position_dodge(width = 0.7), 
                        vjust = -0.5, 
                        size = 3) +
    labs(
        title = "Diabetes Frequency by Income Level",
        x = "Income Level",
        y = "Frequency",
        fill = "Diabetes Status"
    ) +
    scale_fill_manual(
        values = c("red", "blue", "green"),
        labels = c("No Diabetes", "Pre-Diabetes", "Diabetes")
    ) +
    theme_bw() +
    theme(
        plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)
    )

Mức thu nhập thấp (1 - 3): - Mức 1: Nhóm Không tiểu đường chiếm 7,114, trong khi Tiểu đường chỉ đạt 2,383. - Mức 2: Nhóm Không tiểu đường tăng lên 8,341, và nhóm Tiểu đường tăng lên 3,086. - Mức 3: Nhóm Không tiểu đường đạt 12,005, và nhóm Tiểu đường là 3,568.

Mức thu nhập trung bình (4 - 6): - Mức 4: Nhóm Không tiểu đường tăng lên 15,622, trong khi nhóm Tiểu đường là 4,054. - Mức 5: Nhóm Không tiểu đường đạt 20,792, và nhóm Tiểu đường là 4,504. - Mức 6: Nhóm Không tiểu đường tăng đáng kể lên 30,431, và nhóm Tiểu đường đạt 5,291.

Mức thu nhập cao (7 - 8): - Mức 7: Nhóm Không tiểu đường đạt 37,219, và nhóm Tiểu đường là 5,265. - Mức 8: Nhóm Không tiểu đường cao nhất, đạt 82,179, trong khi nhóm Tiểu đường là 7,195.

Nhận xét: Tần suất Không tiểu đường tăng mạnh theo mức thu nhập, đặc biệt ở các mức thu nhập cao (7 - 8). Tỷ lệ Tiểu đường cũng tăng lên nhưng với tốc độ chậm hơn, cho thấy mức thu nhập có thể ảnh hưởng tích cực đến khả năng quản lý sức khỏe và phòng ngừa bệnh tiểu đường.